home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge01.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  4KB  |  222 lines

  1.  
  2. /*
  3.  
  4.     This file is a part of the GLAMMAR source distribution 
  5.     and therefore subjected to the copy notice below. 
  6.     
  7.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  8.  
  9.     This program is free software; you can redistribute it and/or modify
  10.     it under the terms of the GNU General Public License as published by
  11.     the Free Software Foundation version 1
  12.  
  13.     This program is distributed in the hope that it will be useful,
  14.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.     GNU General Public License for more details.
  17.  
  18.     You should have received a copy of the GNU General Public License
  19.     along with this program; if not, write to the Free Software
  20.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22. #include "ge1.h"
  23. #ifdef USKIP
  24. void uskip_() {
  25.   q -= 1;
  26.   (*(q + 1)->q) ();
  27. }
  28. #endif
  29.  
  30. #ifdef LKH
  31. void lkh_epiloque() {
  32.   char          **lkh = (q--)->l;
  33.   ip = *lkh;
  34.   q -= 1;
  35.   (*(q + 1)->q) ();
  36.   (++q)->l = lkh;
  37.   (++q)->q = lkh_epiloque;
  38. }
  39. void lkh_proloque() {
  40.   char          **lkh = (q--)->l;
  41.   *lkh = ip;
  42.   q -= 1;
  43.   (*(q + 1)->q) ();
  44.   (++q)->l = lkh;
  45.   (++q)->q = lkh_proloque;
  46. }
  47. #endif
  48.  
  49. #ifdef UCUT
  50. void ucut() {
  51.   int            *cut_set = (q--)->i;
  52.   *cut_set = 1;
  53.   q -= 1;
  54.   (*(q + 1)->q) ();
  55.   (++q)->i = cut_set;
  56.   (++q)->q = ucut;
  57. }
  58. #endif
  59.  
  60. #ifdef UIDENTIFIER
  61. void uidentifier() {           /* identifier */
  62.  
  63.   register cont  *rq = q;
  64.   char           *rip = ip, *rc = c;
  65.   register affix *A_0 = (rq + 0)->a;
  66.   {
  67.     if (didentifier(A_0)) {
  68.       q = rq + -2;
  69.       (*(rq + -1)->q) ();
  70.       rq = q - -1;
  71.       if (mip < ip) {
  72.         mip = ip;
  73.         set_ip_start_pos = set_line_pos;
  74.         set_ip_start_num = set_line_num;
  75.       }
  76.     }
  77.     ip = rip;
  78.     c = rc;
  79.   if (rc > cstore_top ) cstore_overflow();
  80.   }
  81.   (rq + 0)->a = A_0;
  82.   (rq + 1)->q = uidentifier;
  83.   q = rq + 1;
  84. }
  85. #endif
  86. #define TESTletter  (isalpha (*rip) )
  87. #define TESTmorename  (isalnum (*rip) ) || (*rip == '_') || (*rip == '\'')
  88.  
  89. #ifdef  DIDENTIFIER
  90. int didentifier(A_0)
  91. register AFFIX A_0;
  92. {
  93.   register char *rip = ip, *rc = c;
  94.   if (!TESTletter)
  95.     return false;
  96.   A_0 ->t = rc;
  97.   A_0 ->r = nil;
  98.   A_0 ->l = nil;
  99.   do {
  100.     *rc++ = *rip++;
  101.   } while (TESTmorename);
  102.   *rc++ = '\0';
  103.   ip = rip;
  104.   c = rc;
  105.   if (rc > cstore_top ) cstore_overflow();
  106.   return true;
  107. }
  108. #endif
  109.  
  110. #ifdef ULETTERDIGITSEQUENCE
  111. void uletterdigitsequence() {           /* identifier */
  112.   register cont  *rq = q;
  113.   char           *rip = ip, *rc = c;
  114.   register affix *A_0 = (rq + 0)->a;
  115.   {
  116.     if (dletterdigitsequence(A_0)) {
  117.       q = rq + -2;
  118.       (*(rq + -1)->q) ();
  119.       rq = q - -1;
  120.       if (mip < ip) {
  121.         mip = ip;
  122.         set_ip_start_pos = set_line_pos;
  123.         set_ip_start_num = set_line_num;
  124.       }
  125.     }
  126.     ip = rip;
  127.     c = rc;
  128.   if (rc > cstore_top ) cstore_overflow();
  129.   }
  130.   (rq + 0)->a = A_0;
  131.   (rq + 1)->q = uletterdigitsequence;
  132.   q = rq + 1;
  133. }
  134. #endif
  135. #define TESTletter  (isalpha (*rip) )
  136. #define TESTletdig  (isalnum (*rip) )
  137.  
  138. #ifdef DLETTERDIGITSEQUENCE
  139. int dletterdigitsequence(A_0)
  140. register AFFIX A_0;
  141. {
  142.   register char *rip = ip, *rc = c;
  143.   if (!TESTletter)
  144.     return false;
  145.   A_0 ->t = rc;
  146.   A_0 ->r = nil;
  147.   A_0 ->l = nil;
  148.   do {
  149.     *rc++ = *rip++;
  150.   } while (TESTletdig);
  151.   *rc++ = '\0';
  152.   ip = rip;
  153.   c = rc;
  154.   if (rc > cstore_top ) cstore_overflow();
  155.   return true;
  156. }
  157. #endif
  158.  
  159. #ifdef UNLCR
  160. void unlcr() {             /* nlcr */
  161.   if ((*ip == '\0') || (dterminal_("\n"))) 
  162.   {
  163.     CONTINUE;
  164.   }
  165.   (++q)->q = unlcr;
  166. }
  167. #endif
  168.  
  169. #ifdef DNLCR
  170. int dnlcr() {
  171.   return (*ip == '\0') || (dterminal_("\n"));
  172. }
  173. #endif
  174. #ifdef UBSLASH
  175. void ubackslash() {             /* quote */
  176.   if (dterminal_("\\"))
  177.   {
  178.     CONTINUE;
  179.   }
  180.   (++q)->q = ubackslash;
  181. }
  182. #endif
  183.  
  184. #ifdef DBSLASH
  185. int dbackslash() {
  186.   return  (dterminal_("\\"));
  187. }
  188. #endif
  189.  
  190. #ifdef UQUOTE
  191. void uquote() {             /* quote */
  192.   if (dterminal_("\""))
  193.   {
  194.     CONTINUE;
  195.   }
  196.   (++q)->q = uquote;
  197. }
  198. #endif
  199.  
  200. #ifdef DQUOTE
  201. int dquote() {
  202.   return  (dterminal_("\""));
  203. }
  204. #endif
  205.  
  206. #ifdef UENDOFSENTENCE
  207. void uendofsentence() {           /* endofsentence */
  208.   if (*ip == '\0') {
  209.     q -= 1;
  210.     (*(*(q + 1)).q) ();
  211.   }
  212.   (++q)->q = uendofsentence;
  213. }
  214. #endif
  215.  
  216. #ifdef DENDOFSENTENCE
  217. int dendofsentence() {
  218.   return (*ip == '\0');
  219. }
  220. #endif
  221.  
  222.